本系列同步發表在 個人部落格,歡迎大家關注~
關於頁面中,目前只想顯示些簡單的資訊,App Icon、版本資訊、作者及 License。
就先想辦法顯示這些東西吧~
我們先不急著看程式碼,首先先想一個問題。
App 有時需要用到些內嵌的檔案,例如,Logo、背景圖之類的,那要怎麼加入這些呢?
其實非常地簡單,在 Flutter 都統稱這些為「資源」(asset)。
而很方便的是,Flutter 有一種方法能很快的讓它們加入到 App 中。
就是在 pubspec.yaml
檔案中直接描述要加入的 assets。
要在 lib/ 底下的 *.dart 都裡能使用到 assets,主要有幾個步驟:
pubspec.yaml
加入 assets 描述。Image.asset
和 AssetImage
來顯示圖片。講了很多,還是實際上看些程式碼感受一下比較快。
import "package:flutter/material.dart";
class AboutPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("About"),
),
body: LayoutBuilder(
builder: (BuildContext context, BoxConstraints viewportConstraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(
minWidth: viewportConstraints.maxWidth,
minHeight: viewportConstraints.maxHeight,
),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 24.0),
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
// vvv Assets 圖片用在這裡喔~~
CircleAvatar(
backgroundImage:
AssetImage("assets/images/gitme-reborn-logo.png"),
radius: 40.0,
),
SizedBox(height: 8.0),
Text("gitme reborn",
style: Theme.of(context).textTheme.title),
SizedBox(height: 4.0),
Text("0.0.1",
style: Theme.of(context).textTheme.subtitle),
],
),
Column(
children: <Widget>[
Text("Made by BbsonLin",
style: Theme.of(context).textTheme.caption),
Text("License MIT",
style: Theme.of(context).textTheme.caption),
],
),
],
),
),
),
);
},
),
);
}
}
雖然只有 60 行,但 LayoutBuilder
和 ConstrainedBox
這兩個 Widget 挺陌生的...
這邊就需要解釋一下了,在 SingleChildScrollView
文件中有寫到,SingleChildScrollView
跟 Column
這兩個 Widget 在渲染畫面上其實有點衝突。
Column
會撐畫面滿到盡可能的大,而 SingleChildScrollView
會提供無限的空間給 child
。
那這樣豈不是就沒有任何限制了嗎!?
對,所以你給 Column
crossAxisAlignment: CrossAxisAlignment.center
,它也不知道該怎麼置中...
解決的方法就是給它 限制 。
文件裡給的方法是利用 LayoutBuilder
builder
函數中的參數 viewportConstraints
來搭配 ConstrainedBox
,讓其能給 SingleChildScrollView
的 child
限制,進而達成 Column
置中。
這邊是我個人的理解,如果有理解錯誤,歡迎底下留言告知~~
這邊還有一向問題要解決的,就是版本 0.0.1 目前是寫死在程式碼裡的,要怎麼讓它動態的知道我們版本更新了呢?
還記得在 Day 5 時,我們有使用過第三方套件來處理登入 modal。
我們必須在 pubspec.yaml
的 dependency 裡加上 [pacakge_name]: [semantic version]
。
基本上,在新建一個 Flutter 專案時,pubspec.yaml
檔案中最前面就有一個欄位為 version
,
透過它就能設定 App 的版本囉~
如何在 App 運行時抓到它的值?
Flutter Team 有維護一個套件名為 package_info
,就是在提供此功能的。
--
成果
--
呼~ 真的還滿多細節需要注意的...
明天會是第一階段的最後一天~
對,各位觀眾再撐一天,就能結束 UI 的部份囉...
主要是因為有些小地方需要加強的
明天接續囉~~
參考
感謝詳盡的教學,度過過年的時光XD
剛好看到一個不影響運作的小錯誤:
[ lib/pages/about/about.dart ]
PackageInfo pacakgeInfo = await PackageInfo.fromPlatform();
應該為
PackageInfo packageInfo = await PackageInfo.fromPlatform();
// packageInfo 拼錯惹
繼續做下去 ing
Hi Robby 感謝提醒喔~